package se.wangs.proxydemo;

import org.junit.Test;
import se.wangs.proxydemo.impl.Student;
import se.wangs.proxydemo.impl.Worker;

import java.lang.reflect.Proxy;

/**
 * -- coding: UTF-8 -- *
 *
 * @author wangs
 * @date 2023/12/13 14:04
 * @description 测试类
 */
public class TestDemo {

    /**
     * 静态代理测试
     */
    @Test
    public void staticProxyTest() {
        Student student = new Student("学生1");
        // 得到一个代理对象
        CookProxy proxy = new CookProxy(student);
        proxy.eat();

        System.out.println("--------------------");
        proxy = new CookProxy(new Student("学生2"));
        proxy.eat();

        System.out.println("--------------------");

        Worker worker = new Worker("工人1");
        CookProxy proxy1 = new CookProxy(worker);
        proxy1.eat();
    }
    /*
先做饭...
饭做好了...
学生1：开始吃饭...
--------------------
先做饭...
饭做好了...
学生2：开始吃饭...
--------------------
先做饭...
饭做好了...
工人1：开始吃饭...
    * */

    @Test
    public void dynamicProxyTest() {
        /*
        * 1.调用 Proxy.newProxyInstance 方法获取代理对象
        *   1.1 参数1: 被代理对象的类加载器
        *   1.2 参数2: 别代理对象实现的接口
        *   1.3 参数3: 代理钩子的实例
        *   1.4 得到的是一个代理对象，和参数1是同一个类的
        * */
        Alive studentProxy = (Alive) Proxy.newProxyInstance(Student.class.getClassLoader(),
                Student.class.getInterfaces(),
                new EatProxy(new Student("学生1")));
        // 2.执行方法
        studentProxy.eat();
    }
    /*
    开始做饭...
    饭做好了...
    学生1：开始吃饭...
    洗碗...
    */
}
